#pragma once

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <ctime>
#include <chrono>
#include <cstdarg>
#include <sys/types.h>
#include <unistd.h>

const char *LOG_ERR = "log.err";
const char *LOG_NOR = "log.nor";

enum LogLevel
{
    DEGUG = 0,
    NORMAL,
    WARNING,
    ERROR,
    FATAL
};


const char* to_level(LogLevel level)
{
    switch (level)
    {
        case DEGUG:
            return "DEGUG";
        case NORMAL:
            return "NORMAL";
        case WARNING:
            return "WARNING";
        case ERROR:
            return "ERROR";
        case FATAL:
            return "FATAL";
        default:
            return nullptr;
    }
}

// 
/// @brief 记录日志消息到标准错误流（stderr）。
/// @param level 日志消息的级别，指定日志的重要程度。
/// @param message 要记录的日志消息，可以使用类似 printf 格式的占位符。
/// @param ... 可变参数列表，用于替换 message 中的占位符。
/// @details [日记等级] [时间] [pid] [message]
void logMessage(LogLevel level, const std::string message, ...)
{
    using std::chrono::system_clock;

    const static int NUM = 1024;

    time_t in_now = system_clock::to_time_t(system_clock::now());
    std::string _time(ctime(&in_now));
    _time.pop_back();

    char logfix[NUM];
    snprintf(logfix, sizeof(logfix), "[%s][%s][%d] ", to_level(level), _time.c_str(), getpid());

    char logcontect[NUM];
    va_list arg;
    va_start(arg, message);
    vsnprintf(logcontect, sizeof(logcontect), message.c_str(), arg);

    std::cerr << logfix << logcontect << std::endl;
}